package integracion;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import odv.webservice.SolicitudCotizacionServer;
import odv.webservice.SolicitudCotizacionServerProxy;
import odv.webservice.SolicitudCotizacionServerServiceLocator;

import com.google.gwt.gen2.datepicker.client.CalendarUtil;
import com.thoughtworks.xstream.XStream;
import xmlEntities.CotizacionXML;
import xmlEntities.ItemACotizarXML;
import xmlEntities.ItemCotizadoXML;
import xmlEntities.SolicitudCotizacionXML;
import ejbs.AdmUrls;
import ejbs.Facade;
import entities.Cotizacion;
import entities.ItemACotizar;
import entities.ItemCotizado;
import entities.SolicitudCotizacion;

@Stateless
public class AdmCotizacionesWSBean implements AdmCotizacionesWS {

	@EJB
	AdmUrls admUrls;
	
	@Override
	public Cotizacion cotizar(SolicitudCotizacion solicitudCotizacion) {
		
		// Aca se llama al web service de la oficina de ventas
		Cotizacion cotizacion = enviarSolicitudAOficinaDeVenta(solicitudCotizacion);
		return cotizacion;
		
		// Por ahora lo emulamos asi		
		/*		Cotizacion cotizacion = new Cotizacion();
		cotizacion.setVigencia(new Date(System.currentTimeMillis()));
		Iterator<ItemACotizar> itr = solicitudCotizacion.getItemsACotizar().iterator();
		while(itr.hasNext())
		{
			ItemACotizar itemACotizar = itr.next();			
			ItemCotizado itemCotizado = new ItemCotizado();
			itemCotizado.setCodigo(itemACotizar.getCodigo());
			itemCotizado.setCantidad(itemACotizar.getCantidad());
			itemCotizado.setPrecio(2.0);
			itemCotizado.setCotizacion(cotizacion);			
			cotizacion.getItemsCotizados().add(itemCotizado);
		}*/
	}
	
	public Cotizacion enviarSolicitudAOficinaDeVenta(SolicitudCotizacion solicitudCotizacion)
	{
		String xmlARecibir = null;
		Cotizacion cotizacion = null;
		
		SolicitudCotizacionXML solicitudCotizacionXML = convertirASolicitudCotizacionXML(solicitudCotizacion);
		XStream xstream = new XStream();
		xstream.alias("SolicitudCotizacion", SolicitudCotizacionXML.class);
		xstream.alias("Item", ItemACotizarXML.class);
		
		String xmlAEnviar = xstream.toXML(solicitudCotizacionXML);
		
		System.out.println("======== XML de Solicitud de Cotizacion a Enviar ======");
		System.out.println(xmlAEnviar);		
		
		String endpoint = admUrls.getEndpointOficinaDeVentas();
		
		if (endpoint != null)
		{
			System.out.println("Intentando conectarse con oficina de ventas: " + endpoint);
			
			try {
				SolicitudCotizacionServerServiceLocator serviceLocator = new SolicitudCotizacionServerServiceLocator(); 
				serviceLocator.setSolicitudCotizacionServerPortEndpointAddress(endpoint);
				SolicitudCotizacionServer server = serviceLocator.getSolicitudCotizacionServerPort();
				xmlARecibir = server.cotizar(xmlAEnviar);
			} catch (Exception e) 
			{
				//e.printStackTrace();
				System.out.println("ERROR AL INTENTAR CONECTARSE CON " + endpoint);
			}
			
			if(xmlARecibir != null)
			{
				System.out.println("Conexion exitosa");
				cotizacion = convertirCotizacionXML(xmlARecibir);			
			}
			
			return cotizacion;
		}
		return null;
	}

	@SuppressWarnings("deprecation")
	private Cotizacion convertirCotizacionXML(String xmlARecibir)
	{
		Cotizacion cotizacion = new Cotizacion();
		
		XStream xstream = new XStream();
		xstream.alias("Cotizacion", CotizacionXML.class);
		xstream.alias("Item", ItemCotizadoXML.class);
		
		CotizacionXML cotizacionXML = (CotizacionXML)xstream.fromXML(xmlARecibir);
		
		Date fecha = convertirStringFechaADate(cotizacionXML.getFecha());
		
		//sumamos dias de vigencia a la fecha. No se si esta bien
		CalendarUtil.addDaysToDate(fecha, cotizacionXML.getVigencia());
		
		cotizacion.setVigencia(fecha);
		
		for(int i = 0; i < cotizacionXML.getItems().size(); i++)
		{
			ItemCotizado itemCotizado = new ItemCotizado();
			itemCotizado.setCantidad(cotizacionXML.getItems().get(i).getCantidad());
			itemCotizado.setCodigo(cotizacionXML.getItems().get(i).getCodigo());
			itemCotizado.setCotizacion(cotizacion);
			itemCotizado.setPrecio(Double.parseDouble(String.valueOf(cotizacionXML.getItems().get(i).getPrecio())));
		
			cotizacion.getItemsCotizados().add(itemCotizado);
		}
		
		return cotizacion;	
	}

	private SolicitudCotizacionXML convertirASolicitudCotizacionXML(SolicitudCotizacion solicitudCotizacion) 
	{
		SolicitudCotizacionXML solicitudCotizacionXML = new SolicitudCotizacionXML();
		
		Date fecha = new Date();
		String fechaAAgregar = ConvertirFecha(fecha);
		
		solicitudCotizacionXML.setFecha(fechaAAgregar);
		solicitudCotizacionXML.setTaller(12);
		solicitudCotizacionXML.setNumero(4);
		
		for(ItemACotizar item: solicitudCotizacion.getItemsACotizar())
		{
			ItemACotizarXML itemACotizarXML = new ItemACotizarXML();
			
			itemACotizarXML.setCantidad(item.getCantidad());
			itemACotizarXML.setCodigo(item.getCodigo());
			
			solicitudCotizacionXML.getItems().add(itemACotizarXML);
		}
		
		return solicitudCotizacionXML;
	}
	
	private String ConvertirFecha(Date fecha)
	{
		SimpleDateFormat formatoFecha  = new SimpleDateFormat("yyyyMMdd");	
		return formatoFecha.format(fecha);		
	}
	
	private Date convertirStringFechaADate(String fechaEmision) 
	{
		Date fecha = new Date();
		
		int anio = Integer.valueOf(fechaEmision.substring(0, 4));
		int mes = Integer.valueOf(fechaEmision.substring(4, 6));
		int dia = Integer.valueOf(fechaEmision.substring(6,8));
		
		fecha.setYear(anio-1900);
		fecha.setMonth(mes -1);
		fecha.setDate(dia);	
		
		
		return fecha;
	}



}
